#ifndef INCLUDES_LINKEDLIST_H
#define INCLUDES_LINKEDLIST_H 1

#include <common/macro/build.h>
#include <common/common.h>

typedef struct linked_list_item_t linked_list_item_t;
typedef struct linked_list_t {
	linked_list_item_t *head, *tail;
} linked_list_t;

struct linked_list_item_t {
	linked_list_item_t *prev, *next;
	void *data;
};

API_LIBLOCAL inline linked_list_t *linked_list_new();
API_LIBLOCAL inline void linked_list_destroy(linked_list_t *);
API_LIBLOCAL inline linked_list_item_t *linked_list_head(linked_list_t *);
API_LIBLOCAL inline linked_list_item_t *linked_list_tail(linked_list_t *);
API_LIBLOCAL inline void linked_list_link_after(linked_list_t *, linked_list_item_t *, linked_list_item_t *);
API_LIBLOCAL inline void linked_list_insert_after(linked_list_t *, linked_list_item_t *, void *);
API_LIBLOCAL inline void linked_list_link_before(linked_list_t *, linked_list_item_t *, linked_list_item_t *);
API_LIBLOCAL inline void linked_list_insert_before(linked_list_t *, linked_list_item_t *, void *);
API_LIBLOCAL inline void linked_list_delete(linked_list_t *, linked_list_item_t *);
API_LIBLOCAL inline void linked_list_unlink(linked_list_t *, linked_list_item_t *);
API_LIBLOCAL inline void *linked_list_item_value(linked_list_item_t *);

#endif
